package com.spider.im.common.generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import javax.sql.DataSource;

public class CodeGenerator {
    public static void main(String[] args) {

        // 2. 全局配置（控制台输出路径、作者名等）
        GlobalConfig globalConfig  = new GlobalConfig.Builder()
                .author("joy")
                .outputDir(System.getProperty("user.dir") + "/src/main/java")
                .disableOpenDir()
                .enableSpringdoc()
                .disableServiceInterface()
                .build();

//        globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java"); // 生成文件输出目录[1](@ref)
//        globalConfig.setAuthor("joy");  // 作者署名（会生成在类注释中）[2](@ref)
//        globalConfig.setOpen(false);         // 生成后是否打开输出目录（默认true）
//        globalConfig.setFileOverride(true);  // 覆盖已有文件（谨慎开启）
//        globalConfig.setSwagger2(true);      // 实体类添加Swagger注解[6](@ref)
//        globalConfig.setServiceName("%sService"); // 设置 Service 接口名称格式，去掉 I 前缀

        // 3. 数据源配置（数据库连接信息）
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:postgresql://localhost:5432/chat_db");
        config.setUsername("chat_user");
        config.setPassword("password");
        DataSource dataSource = new HikariDataSource(config);
        DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(dataSource)
                .driverClassName("org.postgresql.Driver")
                .build();
//        dataSource.setUrl("jdbc:postgresql://localhost:5432/chat_db");
//        dataSource.setDriverName("org.postgresql.Driver");
//        dataSource.setUsername("chat_user");
//        dataSource.setPassword("password");
//        dataSource.setDbType(DbType.POSTGRE_SQL);
        // 1. 初始化代码生成器对象
        AutoGenerator generator = new AutoGenerator(dataSourceConfig);
        generator.global(globalConfig);

        // 4. 包配置（生成代码的包结构）
        PackageConfig packageConfig = new PackageConfig.Builder()
                .parent("com.spider.im")// 父包名
                .moduleName("chat")//模块名称
                .entity("entity")// 实体类包名
                .mapper("mapper")  // Mapper接口包名
                .xml("mapper") // Mapper XML文件包名（需在resources中创建对应目录）
                .service("service")  // Service接口包名
                .serviceImpl("service") // Service实现类包名
                .build();

        generator.packageInfo(packageConfig);

        // 5. 策略配置（表映射规则）
        StrategyConfig strategy = new StrategyConfig.Builder()
                .addInclude("tb_user")
                .addTablePrefix("tb_") // 表前缀
                .entityBuilder().columnNaming(NamingStrategy.underline_to_camel)  //列名转驼峰
                .entityBuilder().naming(NamingStrategy.underline_to_camel) //表名转驼峰命名（如user_info → UserInfo）
                .entityBuilder().enableLombok() // 实体类使用Lombok注解
                .entityBuilder().enableTableFieldAnnotation() //开启字段注解
                .mapperBuilder().enableBaseResultMap().enableBaseColumnList()
                .controllerBuilder().enableRestStyle() // Controller生成@RestController
                .serviceBuilder().formatServiceFileName("%sService")
                .controllerBuilder().enableHyphenStyle().build();

        generator.strategy(strategy);

        // 7. 执行生成
        generator.execute();
    }
}